package code_test;
//2.客户端代码：--------------------------------------------------------------------------------

import CSC.MessageBean;
import com.google.gson.Gson;
import org.omg.PortableInterceptor.INACTIVE;
import sun.nio.cs.ext.IBM037;

import javax.sound.sampled.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.SortedMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Client extends JFrame implements ActionListener {
    private static String IP = "123.57.60.39";//服务端的IP地址
    private static final int port = 50000;//端口号
    private Integer User_Id;
    private Integer Friend_Id;
    //定义音频类
    audioUtils client = new audioUtils();
    // 定义所需要的组件
    JPanel jp1, jp2, jp3, jp4;
    JLabel jl1 = null;
    JButton captureBtn, stopBtn, playBtn, saveBtn, sendBtn, linkBtn, delinkBtn, setButton;
    JTextField user_id,frined_id;
    JLabel linkLabel = null;
    JLabel rdLabel = null;
    private Socket socket;
    private Gson  gson = new Gson();;

    // 构造函数
    public Client() {

        //音频类初始化
        client = new audioUtils();
        //文本框初始化

        user_id = new JTextField("请输入本机ID");
        frined_id = new JTextField("请输入对方ID");

        // 组件初始化
        jp1 = new JPanel();
        jp2 = new JPanel();
        jp3 = new JPanel();
        jp4 = new JPanel();

        //定义连接和录音提示
        linkLabel = new JLabel("未连接");
        rdLabel = new JLabel("");
        // 定义字体
        Font myFont = new Font("宋体", Font.BOLD, 30);
        jl1 = new JLabel("实时通信系统客户端");
        jl1.setFont(myFont);
        captureBtn = new JButton("开始录音");
        // 对开始录音按钮进行注册监听
        captureBtn.addActionListener(this);
        captureBtn.setActionCommand("captureBtn");
        // 对停止录音进行注册监听
        stopBtn = new JButton("停止录音");
        stopBtn.addActionListener(this);
        stopBtn.setActionCommand("stopBtn");
        // 对播放录音进行注册监听
//        playBtn = new JButton("播放录音");
//        playBtn.addActionListener(this);
//        playBtn.setActionCommand("playBtn");
        // 对保存录音进行注册监听
//        saveBtn = new JButton("保存录音");
//        saveBtn.addActionListener(this);
//        saveBtn.setActionCommand("saveBtn");
        //对发送录音进行注册监听
        sendBtn = new JButton("发送录音");
        sendBtn.addActionListener(this);
        sendBtn.setActionCommand("sendBtn");
        //对连接录音进行注册监听
        linkBtn = new JButton("连接");
        linkBtn.addActionListener(this);
        linkBtn.setActionCommand("linkBtn");
        //对断开连接进行注册监听
        delinkBtn = new JButton("断开连接");
        delinkBtn.addActionListener(this);
        delinkBtn.setActionCommand("delinkBtn");
        //对设置ip，路径等监听
        setButton = new JButton("保存设置");
        setButton.addActionListener(this);
        setButton.setActionCommand("setButton");

        this.add(jp1, BorderLayout.NORTH);
        this.add(jp2, BorderLayout.CENTER);
        this.add(jp3, BorderLayout.SOUTH);
//        this.add(jp4, BorderLayout.NORTH);
        jp1.add(user_id);
        jp1.add(frined_id);
        jp1.add(setButton);
        jp3.setLayout(null);
        jp3.setLayout(new GridLayout(1, 4, 10, 10));
        jp2.add(rdLabel);
        jp2.add(linkBtn);
        jp2.add(delinkBtn);
        jp2.add(linkLabel);
        jp3.add(captureBtn);
        jp3.add(stopBtn);
        jp3.add(playBtn);
        jp3.add(saveBtn);
        jp3.add(sendBtn);
        // 设置按钮的属性
        this.linkBtn.setEnabled(false);
        this.delinkBtn.setEnabled(false);
        this.captureBtn.setEnabled(false);
        this.stopBtn.setEnabled(false);
        this.playBtn.setEnabled(false);
        this.saveBtn.setEnabled(false);
        this.sendBtn.setEnabled(false);
        this.setButton.setEnabled(true);
        // 设置窗口的属性
        this.setSize(700, 500);
        this.setTitle("客户端");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    //
    public static void main(String[] args) {
        // 创造一个实例
        Client tc = new Client();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("captureBtn")) {
            // 点击开始录音按钮后的动作
            // 停止按钮可以启动
            captureBtn.setEnabled(false);
            stopBtn.setEnabled(true);
            playBtn.setEnabled(false);
            saveBtn.setEnabled(false);
            sendBtn.setEnabled(false);

            // 调用录音的方法
            capture();
            rdLabel.setText("正在录音..");
        } else if (e.getActionCommand().equals("stopBtn")) {
            // 点击停止录音按钮的动作
            captureBtn.setEnabled(true);
            stopBtn.setEnabled(false);
            playBtn.setEnabled(true);
            saveBtn.setEnabled(true);
            if (!linkBtn.isEnabled()) {
                sendBtn.setEnabled(true);
            }

            // 调用停止录音的方法
            stop();
            rdLabel.setText("完成录音..");
        } else if (e.getActionCommand().equals("playBtn")) {
            // 调用播放录音的方法
            play();
        }
        else if (e.getActionCommand().equals("sendBtn")) {
            rdLabel.setText("发送录音..");
            Message message = new Message();
            message.setID(User_Id);
            message.setFriend_ID(Friend_Id);
            message.setAudioInputStream(client.getAis());
            send(message);
        } else if (e.getActionCommand().equals("linkBtn")) {
            linkBtn.setEnabled(false);
            delinkBtn.setEnabled(true);
            if (saveBtn.isEnabled())
                sendBtn.setEnabled(true);
            link();
            if (socket.isConnected())
                linkLabel.setText("已连接:");
        } else if (e.getActionCommand().equals("delinkBtn")) {
            delinkBtn.setEnabled(false);
            linkBtn.setEnabled(true);
            sendBtn.setEnabled(false);
            delink();
            linkLabel.setText("未连接:");
        } else if (e.getActionCommand().equals("setButton")) {
            User_Id = Integer.parseInt(user_id.getText().trim());
            Friend_Id = Integer.parseInt(frined_id.getText().trim());
            this.linkBtn.setEnabled(true);
            this.setButton.setEnabled(false);
            JOptionPane.showMessageDialog(null, "设置成功");
        }
    }

    //连接到服务端
    public void link() {
        //初始化一个套接字
        try {
            socket = new Socket(IP, port);
            Message message = new Message();
            message.setID(User_Id);
            message.setAudioInputStream(null);
            send(message);
            //开启一个接收文件的线程
            receiveMessage();
        } catch (UnknownHostException e) {
            System.out.println("连接失败");
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

    private void receiveMessage() {
        new Thread(new Runnable() {
            /* (non-Javadoc)
             * @see java.lang.Runnable#run()
             */
            /* (non-Javadoc)
             * @see java.lang.Runnable#run()
             */
            /* (non-Javadoc)
             * @see java.lang.Runnable#run()
             */
            public void run() {
                try {
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    String line ;
                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    line = in.readLine();
                    Message messageBean = gson.fromJson(line, Message.class);
                    AudioInputStream ais = messageBean.getAudioInputStream();
                    client.play(ais);
//                    try {
//                        AudioFormat baseFormat = ais.getFormat();
//
//                        DataLine.Info info = new DataLine.Info(SourceDataLine.class, baseFormat);
//
//                        SourceDataLine line_voice = (SourceDataLine) AudioSystem.getLine(info);
//                        System.out.println("正在播放录音");
//                        line_voice.open(baseFormat);
//                        line_voice.start();
//                        int BUFFER_SIZE = 4000 * 4;
//                        int intBytes = 0;
//                        int outBytes;
//                        byte[] audioData = new byte[BUFFER_SIZE];
//                        while (intBytes != -1) {
//                            intBytes = ais.read(audioData, 0, BUFFER_SIZE);
//                            if (intBytes >= 0)
//                                outBytes = line_voice.write(audioData, 0, intBytes);
//                        }
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    } finally {
//                        try {
//                            ais.close();
//                        } catch (IOException e) {
//                            // TODO 自动生成的 catch 块
//                            System.out.println("关流失败");
//                        }
//                    }
//
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /*
     * 断开连接
     * （必须再连接之后再调用此方法，否则控制台会打印当前并无连接。)
     * throws IOExcpetion e(关闭异常失败)
     */
    public void delink() {
        if (socket.isClosed()) System.out.println("当前并无连接");
        try {
            socket.close();
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

    //录音
    public void capture() {
        client.capture();
    }

    // 停止录音
    public void stop() {
        client.stop();
    }

    //播放录音(默认播放刚刚完成的录音)
    public void play() {
        client.play();
    }

    //发送录音到服务端（不保存到本地的发送)
    public void send(Message message) {
        new Thread(new Runnable() {
            public void run() {
                try {
//                    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                    PrintWriter write = new PrintWriter(socket.getOutputStream());
                    String GSON = gson.toJson(message);
                    write.println(GSON);
                    write.flush();
                    //System.out.println("请输入好友ID");
                    //message.setFriendID(Integer.parseInt(br.readLine()));
//                    System.out.println("请输入内容");
//                    String str = br.readLine();
//                    message.setFirst(false);
//                    //System.out.println(str);
//                    while (str != null && !str.equals("end")) {
//                        //System.out.println(str);
//                        message.setContent(str);
//                        //System.out.println(message.getContent());
//                        GSON = gson.toJson(message);
//                        //System.out.println(GSON);
//                        write.println(GSON);
//                        write.flush();
//                        System.out.println("请输入内容");
//                        str = br.readLine();
//                    }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();
    }


}